package com.xh.nci;

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class ADOperTest {
    public ADOperTest() {
    }

    public String GetADInfo(String name) {

        String userName = name; // 用户名称
        if (userName == null) {
            userName = "";
        }
        String company = "";
        String host = "117.79.147.162"; // AD服务器
        String port = "389"; // 端口
        String url = new String("ldap://" + host + ":" + port);
        Hashtable HashEnv = new Hashtable();
        // String adminName ="CN=oyxiaoyuanxy,CN=Users,DC=Hebmc,DC=com";//AD的用户名
        String adminName = "khdev\\administrator"; // 注意用户名的写法：domain\User
        String adminPassword = "kh@2021"; // 密码
        HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别
        HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); // AD User
        HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword); // AD Password
        HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类
        HashEnv.put(Context.PROVIDER_URL, url);
        try {
            LdapContext ctx = new InitialLdapContext(HashEnv, null);
            // 域节点
            String searchBase = "DC=khdev,DC=com";

            // LDAP搜索过滤器类
            String searchFilter = "objectClass=User";

            // 搜索控制器
            SearchControls searchCtls = new SearchControls();

            // 创建搜索控制器
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

            // 设置搜索范围
            String returnedAtts[] = {"objectguid", "objectSID", "employeeID", "name", "userPrincipalName", "physicalDeliveryOfficeName", "departmentNumber", "telephoneNumber", "homePhone", "mobile", "department", "sAMAccountName", "whenChanged", "mail"};// 定制返回属性

            // 设置返回属性集
            searchCtls.setReturningAttributes(returnedAtts);

            // 根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果
            NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);

            // 初始化搜索结果数为0
            int totalResults = 0;
            int rows = 0;
            while (answer.hasMoreElements()) {// 遍历结果集
                SearchResult sr = (SearchResult) answer.next();// 得到符合搜索条件的DN
                System.out.println(++rows + "************************************************");

                String dn = sr.getName();
                String match = dn.split("CN=")[1].split(",")[0];// 返回格式一般是CN=ptyh,OU=专卖
                System.out.println(match);
                if (userName.equals(match)) {
                    Attributes Attrs = sr.getAttributes();// 得到符合条件的属性集
                    if (Attrs != null) {
                        try {
                            for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore(); ) {
                                Attribute Attr = (Attribute) ne.next();// 得到下一个属性
                                System.out.println(" AttributeID=属性名：" + Attr.getID().toString());
                                // 读取属性值
                                for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {
                                    company = e.next().toString();
                                    System.out.println("    AttributeValues=属性值：" + company);
                                }
                                System.out.println("    ---------------");

                            }
                        } catch (NamingException e) {
                            System.err.println("Throw Exception : " + e);
                        }
                    } // if
                }
            } // while
            System.out.println("************************************************");
            System.out.println("Number: " + totalResults);
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
            System.err.println("Throw Exception : " + e);
        }
        return company;
    }

    public static void main(String args[]) {
        // 实例化
        ADOperTest ad = new ADOperTest();
        ad.GetADInfo("danaad");
    }

    private static String getGUID(byte[] inArr) {
        StringBuffer guid = new StringBuffer();
        for (int i = 0; i < inArr.length; i++) {
            StringBuffer dblByte = new StringBuffer(Integer.toHexString(inArr[i] & 0xff));
            if (dblByte.length() == 1) {
                guid.append("0");
            }
            guid.append(dblByte);
        }
        return guid.toString();
    }
}